package com.zuipin.mapper;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import com.zuipin.entity.product.ProductInfo;
import com.zuipin.util.Pagination;
import com.zuipin.vo.BackExtProDetailVo;
import com.zuipin.vo.BackProductInfoDetailVo;
import com.zuipin.vo.BackProductInfoVo;
import com.zuipin.vo.BackProductPlatformSearchVo;
import com.zuipin.vo.HotReviewProVo;
import com.zuipin.vo.ProExtInfoVo;
import com.zuipin.vo.ProExtSerachVo;
import com.zuipin.vo.ProExtVo;
import com.zuipin.vo.ProSearchVo;
import com.zuipin.vo.ProVo;
import com.zuipin.vo.ProductCashierVo;
import com.zuipin.vo.ProductSearchVo;

import net.sf.json.JSONObject;

/**
 * 商品信息数据操作接口类
 *
 * @ClassName ProductInfoMapper
 * @author wangcongyi
 * @date 2017年4月19日 下午7:06:27
 */
@Mapper
public interface ProductInfoMapper {
	
	// 获取商品信息（SKU、名称、价格）并分页
	List<ProVo> findPro(@Param("params") JSONObject object, @Param("page") Pagination page);
	
	// 通过商品Sku查找商品信息
	ProductInfo selectByProSku(String proSku);
	
	// 通过商品Sku查找商品信息（不过滤禁用商品）
	ProductInfo selectByProductSku(JSONObject params);
	
	// 通过商品内部编号查找商品信息
	ProductInfo selectByProNo(String proNo);
	
	// 通过商品内部编号查找商品信息（不过滤禁用商品）
	ProductInfo selectByProductProSku(String proSku);
	
	// 通过商品SKU或商品拓展ID或商品内部编号查找商品拓展信息列表
	List<ProExtInfoVo> queryProExtInfo(@Param("proExt") ProExtSerachVo ProExt);
	
	// 根据关键字等字段自动分页查询商品信息
	// List<ProExtVo> seachProduct(@Param("pro")ProSearchVo pro,
	// @Param("page")Pagination page);
	
	// 根据关键字等字段手动分页查询商品信息
	List<ProExtVo> seachProduct(@Param("pro") ProSearchVo pro, @Param("page") JSONObject obj);
	
	// 根据关键字等字段获取总条数
	Integer getTotalRecord(@Param("pro") ProSearchVo pro);
	
	// 根据商品id查询商品信息
	ProductInfo selectByPrimaryKey(Long id);
	
	// 根据商品id查询商品信息
	ProductInfo selectById(Long id);
	
	// 根据商品SKU查询商品信息
	ProductInfo getProBySku(String proSku);
	
	// 验证商品SKU和商品编码是否唯一
	List<ProductInfo> checkPro(JSONObject params);
	
	// 分页查询商品信息(通用)
	List<ProductInfo> findProduct(@Param("search") ProductSearchVo search, @Param("page") Pagination page);
	
	// 商品分类树查找商品信息列表（通用）
	List<ProductInfo> findProductByCatId(@Param("search") ProductSearchVo search, @Param("page") Pagination page);
	
	// 分页查询商品信息（分系统）
	List<ProductInfo> findProductExt(@Param("search") ProductSearchVo search, @Param("page") Pagination page);
	
	// 商品分类树查找商品信息列表（分系统）
	List<ProductInfo> findProductExtByCatId(@Param("search") ProductSearchVo search, @Param("page") Pagination page);
	
	// 根据商品信息ID和启用禁用状态 查询是否存在
	ProductInfo isExists(JSONObject params);
	
	// 更新商品启用禁用状态
	boolean modifyStatus(JSONObject params);
	
	// 判断是否为积分商品
	ProductInfo isIntegralPro(@Param("sku") String sku);
	
	int deleteByPrimaryKey(Long id);
	
	int insert(ProductInfo record);
	
	boolean insertSelective(ProductInfo record);
	
	boolean updateByPrimaryKeySelective(ProductInfo record);
	
	int updateByPrimaryKey(ProductInfo record);
	
	Map<String, Object> getByProSku(String proSku);
	
	/** 醉品分销 查询商品属性   **/
	List<Map<String, Object>> queryProInfoType(@Param("skuList") List<String> skuList);
	
	/**
	 * 后台查询通用商品基本信息
	 * @param proNo
	 * @return
	 */
	BackExtProDetailVo findExtProDetailByBack(@Param("proSku") String proSku);
	
	/**
	 * 后台查询通用SKU
	 */
	List<BackProductInfoVo> findBackProductInfo(@Param("search") BackProductPlatformSearchVo search, @Param("page") Pagination page);
	
	BackProductInfoDetailVo findProductInfoDetail(@Param("proId") Long proId);
	
	/**
	 * 查询体验品是否重复创建
	 */
	List<ProductInfo> selectExpProIsRepeat(@Param("proSku") String proSku, @Param("weight") BigDecimal weight);
	
	/**
	 * 查询该商品NO下有几个体验品
	 */
	int findExpProCount(@Param("proSku") String proSku);
	
	public HotReviewProVo getHotReviewProVo(String proSku);
	
	public HotReviewProVo getHotReviewProVoById(Long id);
	
	/**
	 * 根据分类查询品牌
	 *
	 * @Title: findListByCategotyIds 
	 * @author: wuyicheng
	 * @date: 2017年8月18日下午10:04:55 
	 * @param categotyIds 分类ID
	 * @param status 是否启用
	 * @return
	 * @return: List<Long>
	 * @throws
	 */
	List<Long> findListByCategotyIds(@Param("categotyIds") List<Long> categotyIds, @Param("status") Short status);
	
	/** 
	 *  查找商品
	 *  
	 * @Title: findProductCashierVo 
	 * @author: wuyicheng
	 * @date: 2017年8月19日上午11:05:53 
	 * @param jsonObject
	 * @param page
	 * @return
	 * @return: List<ProductCashierVo>
	 * @throws 
	 */
	List<ProductCashierVo> findProductCashierVo(@Param("search") ProductSearchVo productSearchVo);
	
	ProductInfo findProById(Long id);
	
	/**
	 * 插入商品如果SKU=="" 则会自动生成SKU：86**************
	 * @param record
	 * @return
	 */
	boolean insertSelectiveSpecial(ProductInfo record);
	
	/**
	 * 
	 * @Title: findProductInfoById 
	 * @Description: 根据Id查询商品
	 * @author xjd
	 * @param @param id
	 * @param @return
	 * @return ProductInfo
	 * @throws
	 */
	ProductInfo findProductInfoById(@Param("id") Long id);
	
	String findMaxProSku();
	
	List<Long> findIdByName(@Param("proName") String proName);
	
}